package com.chaike.hsq.consts;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 * 慧收钱 商户 枚举.
 *
 * @author Luo
 * @version 1.0
 * @date 2022-01-07 15:22
 */
public class HsqMerchantEnum {

    /**
     * 商户进件方法.
     */
    @Getter
    @AllArgsConstructor
    public enum Method {

        /**
         * 个人支付进件.
         */
        AGENT_REGISTER_PERSON("AGENT_REGISTER_PERSON"),

        /**
         * 企业支付进件.
         */
        AGENT_REGISTER_ORG("AGENT_REGISTER_ORG"),

        /**
         * 个体工商户进件.
         */
        AGENT_REGISTER_INDIVIDUAL("AGENT_REGISTER_INDIVIDUAL"),

        /**
         * 特约商户参数配置（微信）.
         */
        AGENT_REGISTER_WX_CONFIG("AGENT_REGISTER_WX_CONFIG"),

        /**
         * 影像资料批量上传.
         */
        BATCH_FILE_UPLOAD("BATCH_FILE_UPLOAD"),

        /**
         * 影像资料批量上传结果通知.
         */
        FILE_UPLOAD_CALLBACK("FILE_UPLOAD_CALLBACK"),

        /**
         * 进件结果查询.
         */
        AGENT_REGISTER_MERCHANT_QUERY("AGENT_REGISTER_MERCHANT_QUERY"),

        /**
         * 影像资料批量上传结果查询.
         */
        BATCH_FILE_UPLOAD_QUERY("BATCH_FILE_UPLOAD_QUERY");

        /**
         * code.
         */
        private final String name;

        /**
         * 根据name获取.
         *
         * @param name name
         * @return 结果
         */
        public static Method getByName(final String name) {
            return Arrays.stream(Method.values()).filter(i -> i.getName().equals(name)).findFirst().orElse(null);
        }

    }

    /**
     * 应答码.
     */
    @Getter
    @AllArgsConstructor
    public enum RespCode {

        /**
         * 110000：受理成功.
         */
        CODE_110000("110000", "受理成功"),

        /**
         * 110001：系统异常，请稍后再试.
         */
        CODE_110001("110001", "系统异常，请稍后再试"),

        /**
         * 110002：代理商不存在.
         */
        CODE_110002("110002", "代理商不存在"),

        /**
         * 110003：外部商户号重复.
         */
        CODE_110003("110003", "外部商户号重复"),

        /**
         * 110004：接口权限不足.
         */
        CODE_110004("110004", "接口权限不足"),

        /**
         * 110005：参数错误，校验不通过.
         */
        CODE_110005("110005", "参数错误，校验不通过"),

        /**
         * 110006：商户号信息不存在.
         */
        CODE_110006("110006", "商户号信息不存在"),

        /**
         * 110007：暂未开通任何支付功能.
         */
        CODE_110007("110007", "暂未开通任何支付功能"),

        /**
         * 110008：文件类型不合法.
         */
        CODE_110008("110008", "文件类型不合法"),

        /**
         * 110009：文件大小超限.
         */
        CODE_110009("110009", "文件大小超限"),

        /**
         * 110010：开户许可图片不存在.
         */
        CODE_110010("110010", "开户许可图片不存在"),

        /**
         * 110011：营业执照图片不存在.
         */
        CODE_110011("110011", "营业执照图片不存在"),

        /**
         * 110012：身份证正面图片不存在.
         */
        CODE_110012("110012", "身份证正面图片不存在"),

        /**
         * 110013：身份证反面图片不存在.
         */
        CODE_110013("110013", "身份证反面图片不存在"),

        /**
         * 110014：门头照图片不存在.
         */
        CODE_110014("110014", "门头照图片不存在"),

        /**
         * 110015：手持身份证正面图片不存在.
         */
        CODE_110015("110015", "手持身份证正面图片不存在"),

        /**
         * 110016：工商网截图图片不存在.
         */
        CODE_110016("110016", "工商网截图图片不存在"),

        /**
         * 110017：IPC备案图图片不存在.
         */
        CODE_110017("110017", "IPC备案图图片不存在"),

        /**
         * 110018：组织机构代码图片不存在.
         */
        CODE_110018("110018", "组织机构代码图片不存在"),

        /**
         * 110019：统一信用代码图片不存在.
         */
        CODE_110019("110019", "统一信用代码图片不存在"),

        /**
         * 110020：营业场所图片不存在.
         */
        CODE_110020("110020", "营业场所图片不存在"),

        /**
         * 110021：其它图片不存在.
         */
        CODE_110021("110021", "其它图片不存在"),

        /**
         * 110022：暂不支持此支付功能在线开通.
         */
        CODE_110022("110022", "暂不支持此支付功能在线开通"),

        /**
         * 110023：商户审核中,暂不支持开通支付功能.
         */
        CODE_110023("110023", "商户审核中,暂不支持开通支付功能"),

        /**
         * 110024：支付功能已开通,请勿重复开通.
         */
        CODE_110024("110024", "支付功能已开通,请勿重复开通");

        /**
         * code.
         */
        private final String code;

        /**
         * 信息.
         */
        private final String message;

        /**
         * 根据code获取对应枚举.
         *
         * @param code code
         * @return MQTagEnum
         */
        public static RespCode fromCode(final String code) {
            return Arrays.stream(RespCode.values()).filter(i -> i.getCode().equals(code)).findFirst().orElse(null);
        }

    }

    /**
     * 申请状态.
     */
    @Getter
    @AllArgsConstructor
    public enum ApplyStatus {

        /**
         * 申请中.
         */
        AUDIT("AUDIT", "申请中"),

        /**
         * 复审中.
         */
        REVIEW("AGENT_REGISTER_ORG", "复审中"),

        /**
         * 审核通过.
         */
        AUDIT_PASS("AUDIT_PASS", "审核通过"),

        /**
         * 审核拒绝.
         */
        AUDIT_REFUSE("AUDIT_REFUSE", "审核拒绝"),

        /**
         * 销户.
         */
        CLOSE("CLOSE", "销户"),

        /**
         * 协议待生成.
         */
        STAY("STAY", "协议待生成"),

        /**
         * 待签约.
         */
        WAIT("WAIT", "待签约"),

        /**
         * 签约失败.
         */
        FAILURE("FAILURE", "签约失败"),

        /**
         * 已签约.
         */
        SIGNED("SIGNED", "已签约");

        /**
         * status.
         */
        private final String status;

        /**
         * 说明.
         */
        private final String explain;

        /**
         * 根据status获取.
         *
         * @param status status
         * @return 结果
         */
        public static ApplyStatus getByStatus(final String status) {
            return Arrays.stream(ApplyStatus.values()).filter(i -> i.getStatus().equals(status)).findFirst().orElse(null);
        }

    }

    /**
     * 状态.
     */
    @Getter
    @AllArgsConstructor
    public enum Status {

        /**
         * 初始化.
         */
        INIT("INIT", "初始化"),

        /**
         * 处理中.
         */
        PROCESSING("PROCESSING", "处理中"),

        /**
         * 成功.
         */
        SUCCESS("SUCCESS", "成功"),

        /**
         * 失败.
         */
        FAIL("FAIL", "失败"),

        /**
         * 完成.
         */
        FINISHED("FINISHED", "完成");

        /**
         * status.
         */
        private final String status;

        /**
         * 说明.
         */
        private final String explain;

        /**
         * 根据status获取.
         *
         * @param status status
         * @return 结果
         */
        public static Status getByStatus(final String status) {
            return Arrays.stream(Status.values()).filter(i -> i.getStatus().equals(status)).findFirst().orElse(null);
        }

    }

    /**
     * 支付功能.
     */
    @Getter
    @AllArgsConstructor
    public enum PayFeature {

        /**
         * 支付宝.
         */
        ALIPAY("ALIPAY", "支付宝"),

        /**
         * 微信.
         */
        WECHAT("WECHAT", "微信"),

        /**
         * 银联.
         */
        UNION("UNION", "银联"),

        /**
         * 支付宝小程序.
         */
        ALI_APPLET("ALI_APPLET", "支付宝小程序"),

        /**
         * 微信小程序.
         */
        WECHAT_APPLET("WECHAT_APPLET", "微信小程序"),

        /**
         * 支付宝公众号.
         */
        ALI_JSAPI("ALI_JSAPI", "支付宝公众号"),

        /**
         * 微信公众号.
         */
        WECHAT_JSAPI("WECHAT_JSAPI", "微信公众号");

        /**
         * value.
         */
        private final String value;

        /**
         * 说明.
         */
        private final String explain;

        /**
         * 根据value获取.
         *
         * @param value value
         * @return 结果
         */
        public static PayFeature getByValue(final String value) {
            return Arrays.stream(PayFeature.values()).filter(i -> i.getValue().equals(value)).findFirst().orElse(null);
        }

    }

    /**
     * 证件类型.
     */
    @Getter
    @AllArgsConstructor
    public enum CertificateType {

        /**
         * 大陆身份证.
         */
        CODE_1("1", "大陆身份证"),

        /**
         * 护照.
         */
        CODE_2("2", "护照"),

        /**
         * 港澳居民来往内地通行证.
         */
        CODE_3("3", "港澳居民来往内地通行证"),

        /**
         * 台湾居民来往内地通行证.
         */
        CODE_4("4", "台湾居民来往内地通行证"),

        /**
         * 其它.
         */
        CODE_5("5", "其它");

        /**
         * value.
         */
        private final String value;

        /**
         * 说明.
         */
        private final String explain;

        /**
         * 根据value获取.
         *
         * @param value value
         * @return 结果
         */
        public static CertificateType getByValue(final String value) {
            return Arrays.stream(CertificateType.values()).filter(i -> i.getValue().equals(value)).findFirst().orElse(null);
        }

    }

    /**
     * 职业.
     */
    @Getter
    @AllArgsConstructor
    public enum Profession {

        /**
         * 各类专业,技术人员.
         */
        CODE_1A("1A", "各类专业,技术人员"),

        /**
         * 国家机关,党群组织,企事业单位的负责人.
         */
        CODE_1B("1B", "国家机关,党群组织,企事业单位的负责人"),

        /**
         * 办事人员和有关人员.
         */
        CODE_1C("1C", "办事人员和有关人员"),

        /**
         * 商业工作人员.
         */
        CODE_1D("1D", "商业工作人员"),

        /**
         * 服务性工作人员.
         */
        CODE_1E("1E", "服务性工作人员"),

        /**
         * 农林牧渔劳动者.
         */
        CODE_1F("1F", "农林牧渔劳动者"),

        /**
         * 生产工作,运输工作和部分体力劳动者.
         */
        CODE_1G("1G", "生产工作,运输工作和部分体力劳动者"),

        /**
         * 不便分类的其他劳动者.
         */
        CODE_1H("1H", "不便分类的其他劳动者");

        /**
         * value.
         */
        private final String value;

        /**
         * 说明.
         */
        private final String explain;

        /**
         * 根据value获取.
         *
         * @param value value
         * @return 结果
         */
        public static Profession getByValue(final String value) {
            return Arrays.stream(Profession.values()).filter(i -> i.getValue().equals(value)).findFirst().orElse(null);
        }

    }

    /**
     * 业务场景.
     */
    @Getter
    @AllArgsConstructor
    public enum BusinessScene {

        /**
         * 扫码.
         */
        SCAN_CODE("扫码", "扫码"),

        /**
         * 公众号.
         */
        MP("公众号", "公众号"),

        /**
         * 小程序.
         */
        MA("小程序", "小程序"),

        /**
         * app.
         */
        APP("app", "app"),

        /**
         * 互联网网站.
         */
        WEB("互联网网站", "互联网网站"),

        /**
         * 其他.
         */
        OTHER("其他", "其他");

        /**
         * value.
         */
        private final String value;

        /**
         * 说明.
         */
        private final String explain;

        /**
         * 根据value获取.
         *
         * @param value value
         * @return 结果
         */
        public static BusinessScene getByValue(final String value) {
            return Arrays.stream(BusinessScene.values()).filter(i -> i.getValue().equals(value)).findFirst().orElse(null);
        }

    }

}
